Spring Cloud | Note-6

Spring Cloud微服务 | Note(6)

@ 2018年8月8日 16:13:08

微服务的消费

实现服务与服务之间的调用;

微服务的消费模式

HTTP常用于消费者(无关平台);

服务直连模式:直接访问URI ;

​ 优点:简洁明了,平台语言无关性;

​ 缺点:无法保证服务的可用性,生产环境中少用;

客户端发现模式:

​ 服务实例启动后,将自己的位置信息提交到服务注册表中;

​ 客户端从服务注册表进行查询,获取可用的服务实例;

​ 客户端自行使用负载均衡算法从多个服务实例中选择一个;

服务端发现模式:

​ 区别于客户端的负载均衡器,是独立的;


常见微服务的消费者

Apache HttpClient:用于高效、丰富的http协议的客户端;提供最新的建议和版本;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 依赖
dependenies{
compile('org.apache.httpcomponents:httpclient:4.5.3')
}
// 注入
@Configuration
public clas RestConfiguration{
@Autowired
private RestTemplateBuilder builder;
@Bean
public RestTemplate restTemplate(){
return builder.build();
}
}
// 使用
@Service
public class WeatherDataServiceImpl implements WeatherDataService{
@Autowired
private RestTemplate restTemplate;
private WeatherResponse doGetWeatherData(String uri){
ResponseEntity<String> response = restTemplate.getForEntity(uri,String.class);
// ...
}
}

Ribbon:基于客户端实现负载均衡的工具,可支持HTTP和TCP;每个负载均衡器都是组合支持;常与Eureka组合使用;提供服务消费的客户端;多种负载均衡的算法;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// 依赖
dependenies{
compile('org.springframework.cloud:spring-cloud-starter-netflix-ribbon')
}
// 注入
@Configuration
@RibbonClient(name="ribbon-client",configuration=RibbonConfiguration.class)
public clas RestConfiguration{
@Autowired
private RestTemplateBuilder builder;
@Bean
public RestTemplate restTemplate(){
return builder.build();
}
}
// 配置
@Configuration
public class RibbonConfiguration{
@Bean
public ZonePreferenceServerListFilter serverListFilter(){
ZonePreferenceServerListFilter filter = new ZonePreferenceServerListFilter();
filter.setZone("myZone");
return filter;
}
@Bean
public IPing ribbonPing(){
return new PingUrl();
}
}
// application.properties
spring.application.name=micro-weather-eureka-client-ribbon
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

// 使用
@RestController
public class CityController{
@Autowired
private RestTemplate restTemplate;
@GetMapping("/cities")
public String listCity(){
// 通过服务应用名称查找
String body = restTemplate.getForEntity("http://msa-weather-city-server/cities",Strign.class);
return body;
}
}

Feign:声明式WEB服务端;可拔插注释的支持;集成负载均衡;Feign 采用的是基于接口的注解;Feign 整合了ribbon,具有负载均衡的能力;整合了Hystrix,具有熔断的能力

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// build.gradle
dependencies {
// Eureka Client
compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')
// Feign
compile('org.springframework.cloud:spring-cloud-starter-openfeign')
// Test
testCompile('org.springframework.boot:spring-boot-starter-test')
}

// application.properties
spring.application.name= micro-weather-eureka-client-feign
eureka.client.serviceUrl.defaultZone= http://localhost:8761/eureka/
feign.client.config.feignName.connectTimeout= 5000
feign.client.config.feignName.readTimeout= 5000

// CityClient.java
@FeignClient("micro-weather-city-eureka")
public interface CityClient {

@GetMapping("/cities")
String listCity();
}
// CityController.java
@RestController
public class CityController {
@Autowired
private CityClient cityClient;

@GetMapping("/cities")
public String listCity() {
// 通过Feign客户端来查找
String body = cityClient.listCity();
return body;
}
}

// Application.java
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class FeignApplication {

public static void main(String[] args) {
SpringApplication.run(FeignApplication.class, args);
}
}

使用Feign实现服务的消费者

解决三个TODO问题

1.数据采集微服务在数据同步任务中,依赖与城市数据API微服务

2.功能服务查询天气信息,依赖于数据API微服务

3.功能服务提供的城市列表,依赖于城市数据API微服务


实现服务的负载均衡及高可用

对每个微服务启动多个实例,作为服务负载均衡的测试

到此,完成从单体架构到微服务架构的Feign负载均衡的,Eureka高可用的搭建


附录

@ 2018年8月9日 15:09:55